package sort.selectionsort;

import sort.generator.ArrayGenerator;
import sort.helper.SortingHelper;

import java.util.Arrays;

/**
 * @author XY
 * @version 1.0
 * @date 2021/8/16 15:51
 * @Description 选择排序，双循环，外层循环记录排序后的最小值，里层循环找出剩余数组中的最小值，总结就是从数组开头开始，每一次都与最小值进行交换位置
 */
public class SelectionSort {

    public static void main(String[] args) {
        int[] dataSize = {10000,100000};
        for (int i : dataSize) {
            Integer[] arr = ArrayGenerator.generateRandomArray(i, i);
            SortingHelper.sortTest("SelectionSort",arr);
        }


        //泛型必须使用类，不能使用基本数据类型
//        Integer[] arr = {5,6,2,4,1,9,7};
//        Integer[] ints = selectionSort(arr);
//        for (int i : ints) {
//            System.out.print(i);
//        }
    }


    //这里使用泛型改造得保证这个数组中的数据必须可比较的<E extends Comparable<E>>
    public static <E extends Comparable<E>> void selectionSort(E[] arr) {
        // arr[0..i)是有序的，arr[i...n)是无序的，这是该排序算法的循环不变量
        for (int i = 0; i < arr.length; i++) {
            int minIndex = i;
            for (int j = i; j < arr.length; j++) {
                //返回结果小于0则是前者小于后者，=0则是相等。>0则是前者大于后者
                if (arr[j].compareTo(arr[minIndex])<0) {
                    minIndex = j;
                }
            }
            E temp = arr[minIndex];
            arr[minIndex]= arr[i];
            arr[i] = temp;
        }
    }
}
